package net.lab1024.sa.admin.module.business.ws;

import jakarta.websocket.OnClose;
import jakarta.websocket.OnMessage;
import jakarta.websocket.OnOpen;
import jakarta.websocket.Session;
import jakarta.websocket.server.ServerEndpoint;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

@Component
@Slf4j
@ServerEndpoint("/ws/message")
public class MessageEndpoint {

    // 使用ConcurrentHashMap线程安全的集合存储连接Session
    public static final Map<String, Session> FrontUsers= new ConcurrentHashMap<>();

    /**
     * 建立WebSocket连接后被调用
     * @poram
     */
    @OnOpen
    public void onOpen(Session session) {
        System.out.println("WebSocket连接已打开");
        // 1、将Session进行保存（Endponi和浏览器的连接是一一对应的）
        // TODO：FrontUsers.put('登录的用户的标识（可以使用用户名）', session);
        FrontUsers.put(session.getId(), session);
    }

    /**
     * 发送消息给客户端
     */
    public static void broadcastAllUsers(String message) {
        try {
            // 1.遍历所有客户端连接实例（多个用户）
            Set<Map.Entry<String, Session>> entrySets = FrontUsers.entrySet();
            for (Map.Entry<String, Session> entry : entrySets) {
                // 2、获取所有用户的Session对象
                Session userSessions = entry.getValue();
                // 3、发送消息
                log.info("发送给用户的信息为：{}", message);
                userSessions.getBasicRemote().sendText(message);
        }
        }catch (IOException e){
            log.error("WebSocket消息发送失败", e);
        }

    }


    /**
     * 浏览器发送消息到服务端调用的方法
     */
    @OnMessage
    public void onMessage(String message) {
        System.out.println("收到消息：" + message);

    }

    @OnClose
    public void onClose(Session session) {
        System.out.println("WebSocket连接已关闭");
        // 从用户集合中移除已关闭的会话
        FrontUsers.remove(session.getId());
    }
}
